#include<stdio.h>
#include<math.h>
//1、题目：有1、2、3、4个数字，能组成多少个互不相同且无重复数字的三位数？都是多少？
//都列出来，选合适的
int main1 ()
{
    int i, j, k, count = 0;
    for (i = 1; i < 5; i++)
        for (j = 1; j < 5;j++)
            for (k = 1; k < 5;k++)
                if(i!=j && i!=k && j!=k)
                {
                    printf("%d%d%d\n", i, j, k);
                    count++;
                }
    printf("共%d个\n", count);
    return 0;
}

/*2、题目：企业发放的奖金根据利润提成。

利润(I)低于或等于10万元时，奖金可提10%；
利润高于10万元，低于20万元时，低于10万元的部分按10%提成，高于10万元的部分，可提成7.5%；
20万到40万之间时，高于20万元的部分，可提成5%；
40万到60万之间时高于40万元的部分，可提成3%；
60万到100万之间时，高于60万元的部分，可提成1.5%；
高于100万元时，超过100万元的部分按1%提成。
从键盘输入当月利润I，求应发放奖金总数？*/

int main2()
{
    double I = 0, p = 0;
    scanf("%lf", &I);
    if(I>100)
    {
        p += (I - 100) * 0.01;
        I = 100;
    }
    if(I>60)
    {
        p += (I - 60) * 0.015;
        I = 60;
    }
    if(I>40)
    {
        p += (I - 40) * 0.03;
        I = 40;
    }
    if(I>20)
    {
        p += (I - 20) * 0.05;
        I = 20;
    }
    if(I>10)
    {
        p += (I - 10) * 0.075;
        I = 10;
    }
    if(I>0)
    {
        p += I * 0.1;
    }
    printf("奖金总数为：%lf万\n", p);
    return 0;
}

//3、题目：一个整数，它加上100后是一个完全平方数，再加上168又是一个完全平方数，请问该数是多少？
int main3_1()//只能算出来一个
{
    int i;
    double t, p;
    for (i = 0;; i++)
    {
        t = sqrt(i + 100);
        p = sqrt(i + 268);
        if (t - (int)t == 0 && p - (int)p == 0)
        {
            printf("%d\n", i);
            break;
        }
    }
        return 0;
}
/*程序分析：
假设该数为 x。
1 则：x + 100 = n*n, x + 100 + 168 = m*m
2 计算等式： m*m - n*n = (m + n)(m - n) = 168
3 设置： m + n = i，m - n = j，i * j =168，i 和 j 至少一个是偶数
4 可得： m = (i + j) / 2， n = (i - j) / 2，i 和 j 要么都是偶数，要么都是奇数。
5 从 3 和 4 推导可知道，i 与 j 均是大于等于 2 的偶数。
6 由于 i * j = 168， j>=2，则 1 < i < 168 / 2 + 1。
接下来将 i 的所有数字循环计算即可。*/
int main3_2()
{
    int x, i, j, m, n;
    for (i = 2; i < 168 / 2 + 1; i += 2)
    {
        j = 168 / i;    
        if(168 % i==0 && i>j && j%2==0)
        {
            m = (i + j) / 2;
            n = (i - j) / 2;
            x = n * n - 100;
            printf("%d+100=%d*%d\n", x, n, n);
            printf("%d+100+168=%d*%d\n", x, m, m);
        }
    }
    return 0;
}
int main3_3()
{
    int x;
    for (int i = 0; (i + 1)*(i + 1) - i * i <= 168;i++)
    {
        double t = sqrt(i * i + 168);
        int m = (int)t;
        if (m == t)
        {
            x = i * i - 100;
            printf("%d+100=%d*%d\n", x, i, i);
            printf("%d+100+168=%d*%d\n", x, m, m);
        }
    }
        return 0;
}
//4、题目：输入某年某月某日，判断这一天是这一年的第几天？
int main4()
{
    int year, month, date, day = 0;
    scanf("%d%d%d", &year, &month, &date);
    int common[]={0,31,28,31,30,31,30,31,31,30,31,30,31};
    int leap[]={0,31,29,31,30,31,30,31,31,30,31,30,31};
    if(year%4==0 && year%400!=0)
    {
        for (int i = 1; i < month;i++)
            day += leap[i];
        day += date;
    }
    else
    {
        for (int i = 1; i < month;i++)
            day += common[i];
        day += date;
    }
    printf("%d年%d月%d日是当年第%d天\n", year, month, date, day);
    return 0;
}

//5、题目：输入三个整数x,y,z，请把这三个数由小到大输出。
int main5_1 ()
{
    int x, y, z;
    scanf("%d%d%d", &x, &y, &z);
    if(x<y&&x<z)
    {
        if(y<z)
            printf("%d %d %d\n", x, y, z);
        else
            printf("%d %d %d\n", x, z, y);
    }
    else if(y<x&&y<z)
    {
        if(x<z)
            printf("%d %d %d\n", y, x, z);
        else
            printf("%d %d %d\n", y, z, x);
    }
    else
    {
        if(x<y)
            printf("%d %d %d\n", z, x, y);
        else
            printf("%d %d %d\n", z, y, x);
    }
    return 0;
}
int main5()
{
    int x, y, z, t;
    scanf("%d%d%d", &x, &y, &z);
    if(x>y)//交换
    {
        t = x;
        x = y;
        y = t;
    }
    if(x>z)
    {
        t = x;
        x = z;
        z = t;
    }
    if(y>z)
    {
        t = y;
        y = z;
        z = t;
    }
    printf("%d %d %d\n", x, y, z);
    return 0;
}
//6、题目：用*号输出字母C的图案
int main6()//太丑了
{
    printf("        *  *  * \n");
    printf("     *\n");
    printf("  *\n");
    printf(" *\n");
    printf(" *\n");
    printf(" *\n");
    printf("  *\n");
    printf("     *\n");
    printf("        *  *  *\n");
    return 0;
}
//7、题目：输出特殊图案，请在c环境中运行，看一看，Very Beautiful!（什么鬼）
int main7()
{
    char a=42,b=35;
    printf("%c%c%c%c%c\n",b,a,a,a,b);
    printf("%c%c%c%c%c\n",a,b,a,b,a);
    printf("%c%c%c%c%c\n",a,a,b,a,a);
    printf("%c%c%c%c%c\n",a,b,a,b,a);
    printf("%c%c%c%c%c\n",b,a,a,a,b);
    return 0;
}
//8、题目：输出9*9口诀。
int main8()
{
    int i, j, p;
    for (i = 1; i < 10;i++)
    {
        for (j = 1; j <= i;j++)
        {
            p = i * j;
            printf("%d✖️ %d=%-3d ", j, i, p);
        }
        printf("\n");
    }
        return 0;
}
//9、题目：要求输出国际象棋棋盘。（8*8）
int main9()
{
    int i, j;
    for (i = 0; i < 8;i++)
    {
        for (j = 0; j < 8;j++)
        {
            if((i+j)%2==0)
                printf("██");//虽然中间有条缝，也只能凑合看了
            else
                printf("  ");
        }
        printf("\n");
    }
        return 0;
}
//10、题目：打印楼梯，同时在楼梯上方打印两个笑脸。
int main10()
{
    printf("⍢⍢\n");
    for (int i = 0; i < 5;i++)
    {
        for (int j = 0; j <= i;j++)
            printf("██");//ASCII扩展码咋使的咱也不知道
        printf("\n");
    }
        return 0;
}
//11、题目：古典问题（兔子生崽）：有一对兔子，从出生后第3个月起每个月都生一对兔子，
//小兔子长到第三个月后每个月又生一对兔子，假如兔子都不死，问每个月的兔子总数为多少？（输出前40个月即可）
/*
成          1   1   2
幼  1   1   1   2   3   
总  1   1   2   3   5   ...(Fibonacci)
*/
int main11()
{
    int a = 1, b = 1, c, n, i;
    // scanf("%d", &n);
    printf("%-12d", 1);
    printf("%-12d", 1);
    
    for (int i = 2; i < 40; i++)
    {
        c = a + b;
        a = b;
        b = c;
        printf("%-12d", c);
    }
    
    //printf("第%d个月共有%d只兔子\n", n, c);

    return 0;
}
//12、题目：判断 101 到 200 之间的素数。

int is_prime(int n)
{
    int flag = 1;
    for (int i = 2; i <= sqrt(n); i++)//根据题目没考虑2的情况
    {
        if(n%i==0)
            flag = 0;
    }
    return flag;
}
int main12()
{
    for (int i = 101; i <= 200;i++)
        if(is_prime(i)==1)
            printf("%-5d", i);
    return 0;
}

//13、题目：打印出所有的"水仙花数"，所谓"水仙花数"是指一个三位数，其各位数字立方和等于该数 本身。
//例如：153是一个"水仙花数"，因为153=1的三次方＋5的三次方＋3的三次方。
int main13()
{
    for (int i = 100; i < 1000; i++)
    {
        int n = 0;
        int k = i;
        while (k)
        {
            n += (k % 10) * (k % 10) * (k % 10);
            k /= 10;
        }
        if(n==i)
            printf("%d  ", i);

    }
    return 0;
}
//14、题目：将一个正整数分解质因数。例如：输入90,打印出90=2*3*3*5。
int main14()
{
    int n;
    scanf("%d", &n);
    printf("%d=", n);
    for (int i = 2; i < n; i++)
    {
        if(n%i==0)
        {
            n /= i;
            printf("%d*", i);
            i = 2;
        }
    }
    printf("%d\n", n);
    return 0;
}
// 15、题目：利用条件运算符的嵌套来完成此题：（ ? : )
// 学习成绩>=90分的同学用A表示，60-89分之间的用B表示，60分以下的用C表示。
int main15()
{
    int score = 0;
    char grade;
    printf("请输入成绩：\n");
    scanf("%d", &score);
    grade = (score >= 90) ? 'A' : ((score >= 60) ? 'B' : 'C');
    printf("等级为：%c\n", grade);
    return 0;
}
//16、题目：输入两个正整数m和n，求其最大公约数和最小公倍数。
int main16()
{
    int m = 0, n = 0, t, p;
    scanf("%d%d", &m, &n);
    p = m * n;
    while (n)
    {
        t = m % n;
        m = n;
        n = t;
    }
    p /= m;
    printf("最大公约数是%d\n最大公倍数是%d\n", m, p );
    return 0;
}
//17、题目：输入一行字符，分别统计出其中英文字母、空格、数字和其它字符的个数。
int main17()
{
    char a[] = {};
    int digit = 0, letter = 0, space = 0, other = 0;
    printf("请输入一行字符：");
    gets(a);
    for (int i = 0; a[i] != '\0';i++)
    {
        if(a[i]>='0'&&a[i]<='9')
            digit++;
        else if(a[i]>='a'&&a[i]<='z' || a[i]>='A'&&a[i]<='Z')
            letter++;
        else if(a[i]==' ')
            space++;
        else
            other++;
    }
    printf("字母%d个,数字%d个,空格%d个,其他%d个\n", letter, digit, space, other);
    return 0;
}
//18、题目：求s=a+aa+aaa+aaaa+aa...a的值，其中a是一个数字。
//例如2+22+222+2222+22222(此时共有5个数相加)，几个数相加有键盘控制。
int main18()
{
    int a, b = 0, n, s = 0;
    scanf("%d%d", &a, &n);
    for (int i = 0; i < n; i++)
    {
        b += a;
        a *= 10;
        s += b;
    }
    printf("%d\n", s);
    return 0;
}
//19、题目：一个数如果恰好等于它的因子之和，这个数就称为"完数"。
//例如6=1＋2＋3，编程找出1000以内的所有完数。
int main19 ()
{
    for (int i = 1; i < 1000;i++)
    {
        int s = 0;
        for (int k = 1; k < i; k++)
        {
            if(i%k==0)
                s += k;
        }
        if(i==s)
            printf("%-6d" , i);
    }
        return 0;
}
//20、题目：一球从100米高度自由落下，每次落地后反跳回原高度的一半；
//再落下，求它在第10次落地时，共经过多少米？第10次反弹多高？
int main20()
{
    double s = 100, h = 50;
    for (int i = 1; i < 10;i++)
    {
        s += 2 * h;
        h /= 2;
    }
    //第十次落地后再反弹是第十次反弹
    printf("第十次落地时共经过%lf米,第十次反弹%lf米高\n", s, h);
    return 0;
}
//21、题目：猴子吃桃问题：猴子第一天摘下若干个桃子，当即吃了一半，还不瘾，
//又多吃了一个第二天早上又将剩下的桃子吃掉一半，又多吃了一个。以后每天早上都吃了前一天剩下的一半零一个。
//到第10天早上想再吃时，见只剩下一个桃子了。求第一天共摘了多少。
int main21()
{
    int x = 1;
    for (int i = 0; i < 9; i++)
        x = x * 2 + 2;
    printf("第一天共摘了%d个桃子\n", x);
    return 0;
}
//22、题目：两个乒乓球队进行比赛，各出三人。甲队为a,b,c三人，乙队为x,y,z三人。已抽签决定比赛名单。
//有人向队员打听比赛的名单。a说他不和x比，c说他不和x,z比，请编程序找出三队赛手的名单。
int main22()
{
    char a, b, c;
    for (a = 'x'; a <= 'z';a++)
        for (b = 'x'; b <= 'z';b++)
            if(a!=b)
                for (c = 'x'; c <= 'z';c++)
                    if(a!=c && b!=c)
                        if(a!='x' && c!='x' && c!='z')
                            printf("a-->%c\nb-->%c\nc-->%c\n", a, b, c);

        return 0;
}
//23、题目：打印出如下图案（菱形）。
/*
   *
  ***
 *****
*******
 *****
  ***
   *
*/
int main23()
{
    //前边空格
    for (int k = 0; k < 7;k++)
    {
        int m = k;
        if (k > 3)
            m = 6 - k;
        for (int i = 0; i < 3 - m; i++)
            printf(" ");
        for (int i = 0; i < 2 * m + 1; i++)
            printf("*");
        printf("\n");

    }
    return 0;
}
//24、题目：有一分数序列：2/1，3/2，5/3，8/5，13/8，21/13...求出这个数列的前20项之和。
int main24()
{
    double sum = 0, i, m = 1, n = 1, k;
    for (i = 0; i < 20; i++)
    {
        k = m + n;
        m = n;
        n = k;
        sum += k / m;
    }
    printf("%lf\n", sum);
    return 0;
}
//25、求1+2!+3!+...+20!的和。
int main25()
{
    int i;
    long long t = 1, sum = 0;
    for (i = 1; i <= 20;i++)
    {
        t *= i;
        sum += t;
    }
    printf("%lld\n", sum);
    return 0;
}
//26、利用递归方法求5!。
int factorial(int n)
{
    if(n==1)
        return 1;
    else
        return n * factorial(n - 1);
}
int main26()
{
    printf("%d\n", factorial(5));
    return 0;
}
//27、利用递归函数调用方式，将所输入的5个字符，以相反顺序打印出来。
char reverse(const char* arr,int i)
{
    if(i==0)
    {
        //printf("%c ", arr[i]);
        putchar(arr[i]);
        return arr[i];
    }
    else
    {
        //printf("%c ", arr[i]);
        putchar(arr[i]);
        return reverse(arr, i - 1);
    }
}
int main27()
{
    char arr[] = {};
    printf("请输入5个字符:\n");
    gets(arr);
    reverse(arr, 4);
    return 0;
}

int main27_2()
{
    int i=5;
    void palin(int n);
    printf("请输入5个字符\40:\40");//转义字符\ddd ddd表示1~3个八进制的数字。
    palin(i);                    //\40=32=空格（ASCII）
    printf("\n");
}
void palin(int n)
{
    char next;
    if(n<=1)
    {
        next=getchar();
        printf("相反顺序输出结果\40:\40");
        putchar(next);
    }
    else
    {
        next=getchar();
        palin(n-1);
        putchar(next);
    }
}
//28、有5个人坐在一起，问第五个人多少岁？他说比第4个人大2岁。
//问第4个人岁数，他说比第3个人大2岁。问第三个人，又说比第2人大两岁。
//问第2个人，说比第一个人大两岁。最后问第一个人，他说是10岁。请问第五个人多大？
int age(int n)
{
    int i = 1;
    if (n == i)
        return 10;
    else
        return age(--n) + 2;
}
int main28()
{
    int i = 5;
    printf("第五个人%d岁\n", age(i));
    return 0;
}
//29、给一个不多于5位的正整数，要求：一、求它是几位数，二、逆序打印出各位数字。
int main29()
{
    int num, count = 0, t;
    scanf("%d", &num);
    printf("逆序打印为：");
    while (num)
    {
        t = num % 10;
        num /= 10;
        printf("%d ", t);
        count++;
    }
    printf("    是%d位\n",count);
    return 0;
}
//30、一个5位数，判断它是不是回文数。即12321是回文数，个位与万位相同，十位与千位相同。
int main()
{
    int n, a, b, c, d, e;
    printf("请输入一个五位数：\n");
    scanf("%d", &n);
    a = n % 10;
    b = n / 10 % 10;
    c = n / 100 % 10;
    d = n / 1000 % 10;
    e = n / 10000;
    if(a==e && b==d)
        printf("%d是回文数\n", n);
    else
        printf("%d不是回文数\n", n);
    return 0;
}